﻿using System;
using System.Data;
using MySql.Data.MySqlClient;

namespace Erebo
{
    public partial class Pagina
    {
        #region Constructores
        /// <summary>
        /// Creo el constructor por defecto.
        /// </summary>
        public Pagina()
        { }
        
        /// <summary>
        /// Constructor por ID.
        /// </summary>
        /// <param name="pId">ID del objeto.</param>
        public Pagina(Int32 pId)
        {
            this.Id = pId;

            //Llena el DataTable con los datos que devuelve la consulta.
            DataTable dt = this.Query();

            //Si no devolvió mas de una fila entonces la consulta me quiere devolver dos (o mas) filas con el mismo ID.
            //Lo cual está mal.
            if (dt.Rows.Count == 1)
                this.FillObject(dt.Rows[0]);
            else
            {
                this.Id = 0;
            }
        }
        #endregion Constructores

        #region Atributos

        //Atributos generales del objeto.
        public Int32 Id { get; set; }
        public String Titulo { get; set; }
        public String SubTitulo { get; set; }
        public String MenuNombre { get; set; }
        public Int32 MenuOrden { get; set; }
        public String Cuerpo { get; set; }
        public PaginaTipo PaginaTipo { get; set; }
        #endregion Atributos

        #region Metodos

        /// <summary>
        /// Guarda el objeto.
        /// </summary>
        public void Save()
        {
            //Abre la conexion con la base de datos.
            MySqlConnection conn = new MySqlConnection(Conexion.ConnectionString());
            conn.Open();

            //Crea el objeto que inserta o actualiza datos en la base.
            MySqlCommand cmd = conn.CreateCommand();

            //Pregunta si el ID es igual a cero, porque en ese caso, quiere decir que no se guardó nunca, y entonces lo tiene que INSERTAR.
            if (this.Id == 0)
            {
                cmd.CommandText = "insert into pagina (Titulo, SubTitulo, MenuNombre, MenuOrden, Cuerpo, PaginaTipoId) values (@Titulo, @SubTitulo, @MenuNombre, @MenuOrden, @Cuerpo, @PaginaTipoId)";
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandText = "update pagina set Titulo = @Titulo, SubTitulo = @SubTitulo, MenuNombre = @MenuNombre, MenuOrden = @MenuOrden, Cuerpo = @Cuerpo, PaginaTipoId = @PaginaTipoId where PaginaId = @Id";
                cmd.CommandType = CommandType.Text;
            }
            
            
            //Crea los parámetros.
            if (this.Id != 0)
                cmd.Parameters.Add("@Id", MySqlDbType.Int32);

            cmd.Parameters.Add("@Titulo", MySqlDbType.VarChar, 100);
            cmd.Parameters.Add("@SubTitulo", MySqlDbType.VarChar, 200);
            cmd.Parameters.Add("@MenuNombre", MySqlDbType.VarChar, 200);
            cmd.Parameters.Add("@MenuOrden", MySqlDbType.Int32);
            cmd.Parameters.Add("@Cuerpo", MySqlDbType.VarChar, 10000);
            cmd.Parameters.Add("@PaginaTipoId", MySqlDbType.Int32);

            //Asigna valores a los parámetros.
            if (this.Id != 0)
                cmd.Parameters["@Id"].Value = this.Id;

            if (!String.IsNullOrEmpty(this.Titulo))
                cmd.Parameters["@Titulo"].Value = this.Titulo;
            else
                cmd.Parameters["@Titulo"].Value = DBNull.Value;

            if (!String.IsNullOrEmpty(this.SubTitulo))
                cmd.Parameters["@SubTitulo"].Value = this.SubTitulo;
            else
                cmd.Parameters["@SubTitulo"].Value = DBNull.Value;

            if (!String.IsNullOrEmpty(this.MenuNombre))
                cmd.Parameters["@MenuNombre"].Value = this.MenuNombre;
            else
                cmd.Parameters["@MenuNombre"].Value = DBNull.Value;

            if (this.MenuOrden != 0)
                cmd.Parameters["@MenuOrden"].Value = this.MenuOrden;
            else
                cmd.Parameters["@MenuOrden"].Value = DBNull.Value;

            if (!String.IsNullOrEmpty(this.Cuerpo))
                cmd.Parameters["@Cuerpo"].Value = this.Cuerpo;
            else
                cmd.Parameters["@Cuerpo"].Value = DBNull.Value;

            if (this.PaginaTipo.Id != 0)
                cmd.Parameters["@PaginaTipoId"].Value = this.PaginaTipo.Id;
            else
                cmd.Parameters["@PaginaTipoId"].Value = DBNull.Value;

            //Ejecuta el INSERT/UPDATE.
            cmd.ExecuteNonQuery();
            
            //Cierro la conexión.
            conn.Close();
        }

        /// <summary>
        /// Elimina el objeto.
        /// </summary>
        public void Delete()
        {
            //Abre la conexion con la base de datos.
            MySqlConnection conn = new MySqlConnection(Conexion.ConnectionString());
            conn.Open();

            //Crea el objeto que inserta o actualiza datos en la base.
            MySqlCommand cmd = conn.CreateCommand();

            //Pregunta si el ID es igual a cero, porque en ese caso, quiere decir que no se guardó nunca, y entonces lo tiene que INSERTAR.
            if (this.Id != 0)
            {
                cmd.CommandText = "delete from pagina where PaginaId = @Id";
                cmd.CommandType = CommandType.Text;
            }
            
            //Crea los parámetros.
            if (this.Id != 0)
            {
                cmd.Parameters.Add("@Id", MySqlDbType.Int32);
                cmd.Parameters["@Id"].Value = this.Id;

                //Ejecuta el INSERT/UPDATE.
                cmd.ExecuteNonQuery();
            }

            //Cierro la conexión.
            conn.Close();
        }

        /// <summary>
        /// Hace la consulta a la base a través de las propiedades del objeto.
        /// Esto se hace asi: Se crea un objeto, se carga en las propiedades del mismo lo que se quiera buscar, y este método
        /// busca en la base mediante los atributos cargados de dicho objeto.
        /// </summary>
        public DataTable Query()
        {
            MySqlConnection conn = new MySqlConnection(Conexion.ConnectionString());
            conn.Open();
            String sql = "select * from pagina U ";
            sql += " where 1=1 ";

            if (this.Id != 0)
                sql += " and U.PaginaId = '" + this.Id + "'";

            if(!String.IsNullOrEmpty(this.Titulo))
                sql += " and U.Titulo = '" + this.Titulo + "'";
            
            if (!String.IsNullOrEmpty(this.SubTitulo))
                sql += " and U.SubTitulo = '" + this.SubTitulo + "'";

            if (!String.IsNullOrEmpty(this.MenuNombre))
                sql += " and U.MenuNombre = '" + this.MenuNombre + "'";

            if (this.MenuOrden != 0)
                sql += " and U.MenuOrden = '" + this.MenuOrden + "'";

            if (!String.IsNullOrEmpty(this.Cuerpo))
                sql += " and U.Cuerpo = '" + this.Cuerpo + "'";

            MySqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;

            //Creo un objeto que me busca los datos en la base.
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            DataTable dt = new DataTable();

            //Lleno el DataTable con los datos que vienen desde la base.
            da.Fill(dt);

            //Cierro la conexion.
            conn.Close();

            //Devuelvo el DataTable.
            return dt;
        }

        /// <summary>
        /// Llena las propiedades del objeto.
        /// </summary>
        /// <param name="dr"></param>
        private void FillObject(DataRow dr)
        {
            if (dr["PaginaId"] != null)
                this.Id = Convert.ToInt32(dr["PaginaId"]);

            if (dr["Titulo"] != null)
                this.Titulo = dr["Titulo"].ToString();

            if (dr["SubTitulo"] != null)
                this.SubTitulo = dr["SubTitulo"].ToString();

            if (dr["MenuNombre"] != null)
                this.MenuNombre = dr["MenuNombre"].ToString();

            if (dr["MenuOrden"] != null)
                this.MenuOrden = Convert.ToInt32(dr["MenuOrden"]);

            if (dr["Cuerpo"] != null)
                this.Cuerpo = dr["Cuerpo"].ToString();

            if (dr["PaginaTipoId"] != null)
                this.PaginaTipo = new PaginaTipo(Convert.ToInt32(dr["PaginaTipoId"].ToString()));
        }

        #endregion Metodos
    }
}